#pragma once
#include <iostream>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include"../comm/util.hpp"
#include<wait.h>
#include"../comm/log.hpp"
namespace ns_compiler
{
    using namespace ns_util;
    using namespace ns_log;
    class Compiler
    {
    public:
    Compiler()
    {

    }
    ~Compiler()
    {

    }

    static bool Compile(const std::string &file_name)
    {
        pid_t pid=fork();
        if(pid<0)
        {
            LOG(ERROR)<<"内部错误\n";
            return false;
        }
        else if(pid==0)
        {
            //子进程
            umask(0);
            int _stderr=open(PathUtil::CompilerError(file_name).c_str(),O_CREAT|O_WRONLY,0644);
            if(_stderr<0)
            {
                LOG(WARNING)<<"没有成功形成stderr文件\n";
                exit(1);
            }
            //创建成功后重定向错误输出
            dup2(_stderr,2);
            //编译
            execlp("g++","g++","-o",PathUtil::Exe(file_name).c_str(),PathUtil::Src(file_name).c_str(),"-D","COMPILER_ONILE","-std=c++11",nullptr);
            LOG(ERROR)<<"启动编译器g++失败，可能是参数错误\n";
            exit(2);
        }
        else
        {
            //父进程
            waitpid(pid,nullptr,0);

            if(FileUtil::IsFileExists(PathUtil::Exe(file_name).c_str()))
            { 
                LOG(INFO)<<PathUtil::Src(file_name).c_str()<<"编译成功"<<"\n";
                return true;
            }
            LOG(ERROR)<<"编译失败，没有生成可执行文件\n";
            return false;

        }
    }



    };

}
